package org.jeecg.modules.oms.mapper;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * @Description: OMS销售统计Mapper
 * @Author: jeecg-boot
 * @Date: 2025-01-13
 * @Version: V1.0
 */
@Mapper
public interface OmsStatisticsMapper {

    /**
     * 获取销售统计数据
     *
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 销售统计数据
     */
    Map<String, Object> getSalesStatistics(@Param("startDate") String startDate, @Param("endDate") String endDate);

    /**
     * 获取销售趋势数据
     *
     * @param period 统计周期 (day/week/month/year)
     * @param limit  返回数据条数
     * @return 销售趋势数据
     */
    List<Map<String, Object>> getSalesTrend(@Param("period") String period, @Param("limit") Integer limit);

    /**
     * 获取订单状态分布统计
     *
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 订单状态分布数据
     */
    List<Map<String, Object>> getOrderStatusDistribution(@Param("startDate") String startDate, @Param("endDate") String endDate);

    /**
     * 获取客户概览统计数据
     *
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 客户概览统计数据
     */
    Map<String, Object> getCustomerOverviewStatistics(@Param("startDate") String startDate, @Param("endDate") String endDate);

    /**
     * 获取客户销售金额排行榜
     *
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @param limit     返回数据条数
     * @return 客户销售金额排行数据
     */
    List<Map<String, Object>> getCustomerSalesRanking(@Param("startDate") String startDate, @Param("endDate") String endDate, @Param("limit") Integer limit);

    /**
     * 获取客户订单数量排行榜
     *
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @param limit     返回数据条数
     * @return 客户订单数量排行数据
     */
    List<Map<String, Object>> getCustomerOrderRanking(@Param("startDate") String startDate, @Param("endDate") String endDate, @Param("limit") Integer limit);

    /**
     * 获取客户贡献度分析数据
     *
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @param type      分析类型 (sales/orders)
     * @return 客户贡献度分析数据
     */
    Map<String, Object> getCustomerContribution(@Param("startDate") String startDate, @Param("endDate") String endDate, @Param("type") String type);

    /**
     * 获取新老客户分析数据
     *
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @param type      分析类型 (count/amount)
     * @return 新老客户分析数据
     */
    Map<String, Object> getCustomerAnalysis(@Param("startDate") String startDate, @Param("endDate") String endDate, @Param("type") String type);

    /**
     * 获取去年同期客户概览统计数据
     *
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 去年同期客户概览统计数据
     */
    Map<String, Object> getLastYearCustomerOverviewStatistics(@Param("startDate") String startDate, @Param("endDate") String endDate);

    // ==================== 产品销售分析相关方法 ====================

    /**
     * 获取产品销售概览统计数据
     *
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 产品销售概览统计数据
     */
    Map<String, Object> getProductOverviewStatistics(@Param("startDate") String startDate, @Param("endDate") String endDate);

    /**
     * 获取产品系列销售排行榜
     *
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @param limit     返回数据条数
     * @return 产品系列销售排行数据
     */
    List<Map<String, Object>> getProductSeriesRanking(@Param("startDate") String startDate, @Param("endDate") String endDate, @Param("limit") Integer limit);

    /**
     * 获取产品颜色销售分析数据
     *
     * @param startDate  开始日期
     * @param endDate    结束日期
     * @param seriesName 产品系列筛选
     * @return 产品颜色销售分析数据
     */
    List<Map<String, Object>> getProductColorAnalysis(@Param("startDate") String startDate, @Param("endDate") String endDate, @Param("seriesName") String seriesName);

    /**
     * 获取客户区域销售分析数据
     *
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @param level     区域级别 (province/city/district)
     * @return 客户区域销售分析数据
     */
    List<Map<String, Object>> getProductRegionAnalysis(@Param("startDate") String startDate, @Param("endDate") String endDate, @Param("level") String level);

    /**
     * 获取产品销售趋势分析数据
     *
     * @param period    统计周期 (day/week/month/year)
     * @param limit     返回数据点数量
     * @param dimension 分析维度 (sales/orders/quantity)
     * @return 产品销售趋势分析数据
     */
    List<Map<String, Object>> getProductTrend(@Param("period") String period, @Param("limit") Integer limit, @Param("dimension") String dimension);

    /**
     * 获取产品销售分布图表数据
     *
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @param type      分布类型 (series/color/region)
     * @return 产品销售分布图表数据
     */
    List<Map<String, Object>> getProductDistribution(@Param("startDate") String startDate, @Param("endDate") String endDate, @Param("type") String type);

    // ==================== 区域销售分析相关方法 ====================

    /**
     * 获取区域销售概览统计数据
     *
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @param level     区域级别 (province/city/area)
     * @return 区域销售概览统计数据
     */
    Map<String, Object> getRegionOverviewStatistics(@Param("startDate") String startDate, @Param("endDate") String endDate, @Param("level") String level);

    /**
     * 获取区域销售分布数据
     *
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @param level     区域级别 (province/city/area)
     * @param dataType  数据类型 (sales/orders/customers)
     * @return 区域销售分布数据
     */
    List<Map<String, Object>> getRegionDistribution(@Param("startDate") String startDate, @Param("endDate") String endDate, @Param("level") String level, @Param("dataType") String dataType);

    /**
     * 获取区域销售排行榜
     *
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @param level     区域级别 (province/city/area)
     * @param limit     返回数据条数
     * @return 区域销售排行数据
     */
    List<Map<String, Object>> getRegionRanking(@Param("startDate") String startDate, @Param("endDate") String endDate, @Param("level") String level, @Param("limit") Integer limit);

    /**
     * 获取区域增长率对比数据
     *
     * @param period 统计周期 (month/quarter/year)
     * @param level  区域级别 (province/city/area)
     * @param limit  返回数据条数
     * @return 区域增长率对比数据
     */
    List<Map<String, Object>> getRegionGrowth(@Param("period") String period, @Param("level") String level, @Param("limit") Integer limit);

    /**
     * 获取区域销售趋势数据
     *
     * @param period 统计周期 (month/quarter/year)
     * @param level  区域级别 (province/city/area)
     * @param limit  返回数据点数量
     * @return 区域销售趋势数据
     */
    List<Map<String, Object>> getRegionTrend(@Param("period") String period, @Param("level") String level, @Param("limit") Integer limit);
}
